home *** CD-ROM | disk | FTP | other *** search
/ SGI Developer Toolbox 6.1 / SGI Developer Toolbox 6.1 - Disc 4.iso / src / exampleCode / swirl / swirl.c < prev    next >
Encoding:
C/C++ Source or Header  |  1994-08-02  |  19.0 KB  |  777 lines

  1. /*
  2.  * Copyright 1992, 1993, 1994, Silicon Graphics, Inc.
  3.  * All Rights Reserved.
  4.  *
  5.  * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, Inc.;
  6.  * the contents of this file may not be disclosed to third parties, copied or
  7.  * duplicated in any form, in whole or in part, without the prior written
  8.  * permission of Silicon Graphics, Inc.
  9.  *
  10.  * RESTRICTED RIGHTS LEGEND:
  11.  * Use, duplication or disclosure by the Government is subject to restrictions
  12.  * as set forth in subdivision (c)(1)(ii) of the Rights in Technical Data
  13.  * and Computer Software clause at DFARS 252.227-7013, and/or in similar or
  14.  * successor clauses in the FAR, DOD or NASA FAR Supplement. Unpublished -
  15.  * rights reserved under the Copyright Laws of the United States.
  16.  */
  17. #include <gl.h>
  18. #include <device.h>
  19. #include <math.h>
  20.  
  21. long RX = 300;
  22. long RY = 300;
  23.  
  24. #define PI 3.1415926535897
  25.  
  26. float *DX, *DY;
  27. unsigned char *R, *R1;
  28.  
  29. #define raster(i, j, c)        (*(R + (i*RY + j)*3 + c))
  30. #define raster1(i, j, c)    (*(R1 + (i*RY + j)*3 + c))
  31. #define dx(i, j)        (*(DX + (i*RY + j)))
  32. #define dy(i, j)        (*(DY + (i*RY + j)))
  33.  
  34. long ipattern = 0, idx = 0, idy = 0;
  35. long ipatternmax = 8, dmax = 26;
  36. float param1 = 1.0, param2 = 1.0;
  37. long generation = 0, stopped = 0;
  38. short dflag = 0;
  39.  
  40. void allocrasters()
  41. {
  42.     R = (unsigned char *)malloc(RX*RY*3);
  43.     R1 = (unsigned char *)malloc(RX*RY*3);
  44.     DX = (float *)malloc(RX*RY*sizeof(float));
  45.     DY = (float *)malloc(RX*RY*sizeof(float));
  46. }
  47.  
  48. void displayraster()
  49. {
  50.     long i, j, k, l, m;
  51.     char title[50], *halt;
  52.     
  53.     if (dflag == 0) {
  54.     for (i = 0; i < RX; i++)
  55.         for (j = 0; j < RY; j++) {
  56.         k = raster(i, j, 0);
  57.         l = raster(i, j, 1);
  58.         m = raster(i, j, 2);
  59.         RGBcolor(k, l, m);
  60.         pnt2i(i, j);
  61.         }
  62.     } else {
  63.     for (i = 0; i < RX; i++)
  64.         for (j = 0; j < RY; j++) {
  65.         k = raster1(i, j, 0);
  66.         l = raster1(i, j, 1);
  67.         m = raster1(i, j, 2);
  68.         RGBcolor(k, l, m);
  69.         pnt2i(i, j);
  70.         }
  71.     }
  72.     swapbuffers();
  73.     if (stopped) halt = "[halted]";
  74.     else halt = "";
  75.     
  76.     if (param1 == 1.0 && param2 == 1.0)
  77.     sprintf(title, "ns %d %d %d (gen %d) %s", ipattern, idx, idy, generation, halt);
  78.     else if (param2 == 1.0)
  79.     sprintf(title, "ns %d %d %d %g (gen %d) %s",
  80.         ipattern, idx, idy, param1, generation, halt);
  81.     else
  82.     sprintf(title, "ns %d %d %d %g %g (gen %d) %s",
  83.         ipattern, idx, idy, param1, param2, generation, halt);
  84.     wintitle(title);
  85. }
  86.  
  87. void initraster()
  88. {
  89.     long i, j, k, i1, j1, i_1, j_1;
  90.     long th, sh;
  91.     float r, s, v[3], x1, y1;
  92.     unsigned long *lptr;
  93.     
  94.     if (ipattern != -1) allocrasters();
  95.     
  96.     switch (ipattern) {
  97.         default:
  98.     case -1:
  99.         sizeofimage("in.rgb",&RX, &RY);
  100.         allocrasters();
  101.         lptr = (unsigned long *)longimagedata("in.rgb");
  102.         for (j = 0; j < RY; j++) {
  103.         for (i = 0; i < RX; i++) {
  104.             int c = *lptr++;
  105.             raster(i, j, 0) = (c>>0)&0xff;
  106.             raster(i, j, 1) = (c>>8)&0xff;
  107.             raster(i, j, 2) = (c>>16)&0xff;
  108.         }
  109.         }
  110.         break;
  111.     case 0:
  112.         for (i = 0; i < RX; i++)
  113.         for (j = 0; j < RY; j++) {
  114.             raster(i, j, 0) = 0;
  115.             raster(i, j, 1) = 0;
  116.             raster(i, j, 2) = 0;
  117.         }
  118.         break;
  119.     case 1:
  120.         for (i = 0; i < RX; i++)
  121.         for (j = 0; j < RY; j++) {
  122.             raster(i, j, 0) = (i*5*255/(RX-1))&0xff;
  123.             raster(i, j, 1) = (i*5*255/(RX-1))&0xff;
  124.             raster(i, j, 2) = (i*5*255/(RX-1))&0xff;
  125.         }
  126.         break;
  127.     case 2:
  128.         for (i = 0; i < RX; i++)
  129.         for (j = 0; j < RY; j++) {
  130.             r = 60.0*((float)i)/(RX-1);
  131.             th = r;
  132.             if ((th % 5) == 0) i1 = 0; else i1 = 255;
  133.             raster(i, j, 0) = i1;
  134.             raster(i, j, 1) = i1;
  135.             raster(i, j, 2) = i1;
  136.         }
  137.         break;
  138.     case 3:
  139.         for (i = 0; i < RX; i++)
  140.         for (j = 0; j < RY; j++) {
  141.             r = 60.0*((float)i)/(RX-1);
  142.             th = r;
  143.             s = 60.0*((float)j)/(RY-1);
  144.             sh = s;
  145.             if (((sh % 5) == 0) ||((th % 5) == 0)) i1 = 0; else i1 = 255;
  146.             raster(i, j, 0) = i1;
  147.             raster(i, j, 1) = i1;
  148.             raster(i, j, 2) = i1;
  149.         }
  150.         break;
  151.     case 4:
  152.         for (i = 0; i < RX; i++)
  153.         for (j = 0; j < RY; j++) {
  154.             i1 = i-RX/2; j1 = j-RY/2;
  155.             raster(i, j, 0) = ((i1*i1+j1*j1)/50)&0xff;
  156.             raster(i, j, 1) = ((i1*i1+j1*j1)/45)&0xff;
  157.             raster(i, j, 2) = ((i1*i1+j1*j1)/70)&0xff;
  158.         }
  159.         break;
  160.     case 5:
  161.         for (i = 0; i < RX; i++)
  162.         for (j = 0; j < RY; j++) {
  163.             th = atan2((j-(RY-1)/2.0), (i-(RX-1)/2.0))*127.5/PI;
  164.             raster(i, j, 0) = (th)&0xff;
  165.             raster(i, j, 1) = (th+85)&0xff;
  166.             raster(i, j, 2) = (th+170)&0xff;
  167.         }
  168.         break;
  169.     case 6:
  170.         for (i = 0; i < RX; i++) {
  171.             v[0] = 126+126.0*cos((i*PI*10)/(RY-1));
  172.             v[1] = 126+126.0*cos((i*PI*8)/(RY-1));
  173.             v[2] = 126+126.0*cos((i*PI*2)/(RY-1));
  174.         for (j = 0; j < RY; j++) {
  175.             raster(i, j, 0) = v[0];
  176.             raster(i, j, 1) = v[1];
  177.             raster(i, j, 2) = v[2];
  178.         }
  179.         }
  180.         break;
  181.     case 7:
  182.         for (i = 0; i < RX; i++) {
  183.         for (j = 0; j < RY; j++) {
  184.             v[0] = 126+126.0*cos(((abs(i-RX/2)+abs(j-RY/2))*PI*10)/(RY+RX-2));
  185.             v[1] = 126+126.0*cos(((abs(i-RX/2)+abs(j-RY/2))*PI*8)/(RY+RX-2));
  186.             v[2] = 126+126.0*cos(((abs(i-RX/2)+abs(j-RY/2))*PI*2)/(RY+RX-2));
  187.             raster(i, j, 0) = v[0];
  188.             raster(i, j, 1) = v[1];
  189.             raster(i, j, 2) = v[2];
  190.         }
  191.         }
  192.         break;
  193.     case 8:
  194.         for (i = 0; i < RX; i++)
  195.         for (j = 0; j < RY; j++) {
  196.             raster(i, j, 0) = (i*255/(RX-1))&0xff;
  197.             raster(i, j, 1) = (j*255/(RX-1))&0xff;
  198.             raster(i, j, 2) = 0;
  199.         }
  200.         break;
  201.     }
  202.     switch (idx) {
  203.     default:
  204.     case 0:
  205.         for (i = 0; i < RX; i++)
  206.         for (j = 0; j < RY; j++) {
  207.             dx(i, j) = 0;
  208.         }
  209.         break;
  210.     case 1:
  211.         for (i = 0; i < RX; i++)
  212.         for (j = 0; j < RY; j++) {
  213.             dx(i, j) = param1*12*cos((j*PI*10*param2)/(RY-1));
  214.         }
  215.         break;
  216.     case 2:
  217.         for (i = 0; i < RX; i++)
  218.         for (j = 0; j < RY; j++) {
  219.             dx(i, j) = param1*12*cos((j*PI*4*param2)/(RY-1));
  220.         }
  221.         break;
  222.     case 3:
  223.         for (i = 0; i < RX; i++)
  224.         for (j = 0; j < RY; j++) {
  225.             dx(i, j) = param1*15*cos((j*PI*2*param2)/(RY-1));
  226.         }
  227.         break;
  228.     case 4:
  229.         for (i = 0; i < RX; i++)
  230.         for (j = 0; j < RY; j++) {
  231.             dx(i, j) = param1*8*cos((j*PI*4*param2)/(RY-1));
  232.         }
  233.         break;
  234.     case 5:
  235.         for (i = 0; i < RX; i++)
  236.         for (j = 0; j < RY; j++) {
  237.             dx(i, j) = param1*5*sin((j*PI*14*param2)/(RY-1));
  238.         }
  239.         break;
  240.     case 6:
  241.         for (i = 0; i < RX; i++)
  242.         for (j = 0; j < RY; j++) {
  243.             dx(i, j) = param1*15*sin((j*PI*param2)/(RY-1));
  244.         }
  245.         break;
  246.     case 7:
  247.         for (i = 0; i < RX; i++)
  248.         for (j = 0; j < RY; j++) {
  249.             dx(i, j) = param1*(float)j/30;
  250.         }
  251.         break;
  252.     case 8:
  253.         for (i = 0; i < RX; i++)
  254.         for (j = 0; j < RY; j++) {
  255.             dx(i, j) = param1*5*sin((j*PI*14)/(RY-1))*cos((i*PI*2*param2)/(RX-1));
  256.         }
  257.         break;
  258.     case 9:
  259.         for (i = 0; i < RX; i++)
  260.         for (j = 0; j < RY; j++) {
  261.             dx(i, j) = (((rand())>>5)&0x1f) - 16;
  262.         }
  263.         for (k = 0; k < 4; k++)
  264.         for (i = 0; i < RX; i++)
  265.             for (j = 0; j < RY; j++) {
  266.             i1 = i+1; j1 = j+1;
  267.             i_1 = i-1; j_1 = j-1;
  268.             if (i1 == RX) i1 = 0;
  269.             if (j1 == RY) j1 = 0;
  270.             if (i_1 == -1) i1 = RX-1;
  271.             if (j_1 == -1) j1 = RY-1;
  272.             dx(i, j) = (4*(dx(i, j)) + dx(i1, j1) + dx(i_1, j1) +
  273.                     dx(i_1, j_1) + dx(i1, j_1) + 2*(dx(i, j1) +
  274.                     dx(i, j_1) + dx(i1, j) + dx(i_1, j)))/16.0;
  275.             }
  276.         break;
  277.     case 10:
  278.         for (i = 0; i < RX; i++)
  279.         for (j = 0; j < RY; j++) {
  280.             dx(i, j) = param1*8*cos((j*PI*10*param2)/(RY-1));
  281.         }
  282.         break;
  283.     case 11:
  284.         for (i = 0; i < RX; i++)
  285.         for (j = 0; j < RY; j++) {
  286.             x1 = -1.0 + 2.0*i/(RX-1);
  287.             y1 = -1.0 + 2.0*j/(RY-1);
  288.             dx(i, j) = 12.0*(x1*x1-y1*y1) + param1;
  289.         }
  290.         break;
  291.     case 12:
  292.         for (i = 0; i < RX; i++)
  293.         for (j = 0; j < RY; j++) {
  294.             x1 = -1.0 + 2.0*i/(RX-1);
  295.             y1 = -1.0 + 2.0*j/(RY-1);
  296.             r = x1*x1+y1*y1;
  297.             dx(i, j) = -param1*8.0*y1/(1.0+r*r);
  298.         }
  299.         break;
  300.     case 13:
  301.         for (i = 0; i < RX; i++)
  302.         for (j = 0; j < RY; j++) {
  303.             x1 = -1.0 + 2.0*i/(RX-1);
  304.             y1 = -1.0 + 2.0*j/(RY-1);
  305.             r = x1*x1+y1*y1;
  306.             dx(i, j) = -param1*8.0*x1/(1.0+r*r);
  307.         }
  308.         break;
  309.     case 14:
  310.         for (i = 0; i < RX; i++)
  311.         for (j = 0; j < RY; j++) {
  312.             x1 = -1.0 + 2.0*i/(RX-1);
  313.             y1 = -1.0 + 2.0*j/(RY-1);
  314.             r = x1*x1+y1*y1;
  315.             dx(i, j) = param1*8.0*x1/(1.0+r*r);
  316.         }
  317.         break;
  318.     case 15:
  319.         for (i = 0; i < RX; i++)
  320.         for (j = 0; j < RY; j++) {
  321.             x1 = -1.0 + 2.0*i/(RX-1)-0.5;
  322.             y1 = -1.0 + 2.0*j/(RY-1);
  323.             r = x1*x1+y1*y1;
  324.             dx(i, j) = param1*7.0*(x1)/(1.0+r*r);
  325.             x1 = -1.0 + 2.0*i/(RX-1)+0.5;
  326.             y1 = -1.0 + 2.0*j/(RY-1);
  327.             r = x1*x1+y1*y1;
  328.             dx(i, j) -= param1*7.0*(x1)/(1.0+r*r);
  329.         }
  330.         break;
  331.     case 16:
  332.         for (i = 0; i < RX; i++)
  333.         for (j = 0; j < RY; j++) {
  334.             x1 = -1.0 + 2.0*i/(RX-1);
  335.             y1 = -1.0 + 2.0*j/(RY-1);
  336.             r = x1*x1+y1*y1;
  337.             dx(i, j) = -param1*8*y1/(.5+r) +x1*3;
  338.         }
  339.         break;
  340.     case 17:
  341.         for (i = 0; i < RX; i++)
  342.         for (j = 0; j < RY; j++) {
  343.             dx(i, j) = param1*5*sin((j*PI*14)/(RY-1))+cos((i*PI*2*param2)/(RX-1));
  344.         }
  345.         break;
  346.     case 18:
  347.         for (i = 0; i < RX; i++)
  348.         for (j = 0; j < RY; j++) {
  349.             x1 = -1.0 + 2.0*i/(RX-1);
  350.             y1 = -1.0 + 2.0*j/(RY-1);
  351.             r = x1*x1+y1*y1;
  352.             dx(i, j) = param1*8.0*x1/(1.0+r)*cos(20*r);
  353.         }
  354.         break;
  355.     case 19:
  356.         for (i = 0; i < RX; i++)
  357.         for (j = 0; j < RY; j++) {
  358.             x1 = -1.0 + 2.0*i/(RX-1);
  359.             y1 = -1.0 + 2.0*j/(RY-1);
  360.             dx(i, j) = param1*8.0*(x1*x1-y1*y1);
  361.         }
  362.         break;
  363.     case 20:
  364.         for (i = 0; i < RX; i++)
  365.         for (j = 0; j < RY; j++) {
  366.             x1 = -1.0 + 2.0*i/(RX-1);
  367.             y1 = -1.0 + 2.0*j/(RY-1);
  368.             x1 *= param2; y1 *= param2;
  369.             dx(i, j) = param1*8.0*exp(x1)*cos(5*y1);
  370.         }
  371.         break;
  372.     case 21:
  373.         for (i = 0; i < RX; i++)
  374.         for (j = 0; j < RY; j++) {
  375.             x1 = -1.0 + 2.0*i/(RX-1);
  376.             y1 = -1.0 + 2.0*j/(RY-1);
  377.             dx(i, j) = -param1*8.0*(cos(4*PI*(x1-y1)));
  378.         }
  379.         break;
  380.     case 22:
  381.         for (i = 0; i < RX; i++)
  382.         for (j = 0; j < RY; j++) {
  383.             x1 = -1.0 + 2.0*i/(RX-1);
  384.             y1 = -1.0 + 2.0*j/(RY-1);
  385.             dx(i, j) = -param1*8.0/(1.3+cos(4*PI*(x1-y1)));
  386.         }
  387.         break;
  388.     case 23:
  389.         for (i = 0; i < RX; i++)
  390.         for (j = 0; j < RY; j++) {
  391.             x1 = -1.0 + 2.0*i/(RX-1);
  392.             y1 = -1.0 + 2.0*j/(RY-1);
  393.             dx(i, j) = -param1*8.0*(cos(param2*4*PI*(y1*y1)));
  394.         }
  395.         break;
  396.     case 24:
  397.         for (i = 0; i < RX; i++)
  398.         for (j = 0; j < RY; j++) {
  399.             x1 = -1.0 + 2.0*i/(RX-1);
  400.             y1 = -1.0 + 2.0*j/(RY-1);
  401.             dx(i, j) = -param1*8.0*(cos(param2*4*PI*(y1*y1-x1*x1)));
  402.         }
  403.         break;
  404.     case 25:
  405.         for (i = 0; i < RX; i++)
  406.         for (j = 0; j < RY; j++) {
  407.             x1 = -1.0 + 2.0*i/(RX-1);
  408.             y1 = -1.0 + 2.0*j/(RY-1);
  409.             dx(i, j) = -param1*12.0*x1*(cos(param2*4*PI*(y1)));
  410.         }
  411.         break;
  412.     case 26:
  413.         for (i = 0; i < RX; i++)
  414.         for (j = 0; j < RY; j++) {
  415.             x1 = -1.0 + 2.0*i/(RX-1);
  416.             y1 = -1.0 + 2.0*j/(RY-1);
  417.             dx(i, j) = -param1*15.0*x1*x1*(cos(param2*4*PI*(y1)));
  418.         }
  419.         break;
  420.     }
  421.     switch (idy) {
  422.     default:
  423.     case 0:
  424.         for (i = 0; i < RX; i++)
  425.         for (j = 0; j < RY; j++) {
  426.             dy(i, j) = 0;
  427.         }
  428.         break;
  429.     case 1:
  430.         for (i = 0; i < RX; i++)
  431.         for (j = 0; j < RY; j++) {
  432.             dy(i, j) = param1*12*cos((i*PI*10*param2)/(RX-1));
  433.         }
  434.         break;
  435.     case 2:
  436.         for (i = 0; i < RX; i++)
  437.         for (j = 0; j < RY; j++) {
  438.             dy(i, j) = param1*12*cos((i*PI*4*param2)/(RX-1));
  439.         }
  440.         break;
  441.     case 3:
  442.         for (i = 0; i < RX; i++)
  443.         for (j = 0; j < RY; j++) {
  444.             dy(i, j) = param1*15*cos((i*PI*2*param2)/(RX-1));
  445.         }
  446.         break;
  447.     case 4:
  448.         for (i = 0; i < RX; i++)
  449.         for (j = 0; j < RY; j++) {
  450.             dy(i, j) = param1*8*cos((i*PI*4*param2)/(RX-1));
  451.         }
  452.         break;
  453.     case 5:
  454.         for (i = 0; i < RX; i++)
  455.         for (j = 0; j < RY; j++) {
  456.             dy(i, j) = param1*5*sin((i*PI*14*param2)/(RX-1));
  457.         }
  458.         break;
  459.     case 6:
  460.         for (i = 0; i < RX; i++)
  461.         for (j = 0; j < RY; j++) {
  462.             dy(i, j) = param1*15*sin((i*PI*param2)/(RX-1));
  463.         }
  464.         break;
  465.     case 7:
  466.         for (i = 0; i < RX; i++)
  467.         for (j = 0; j < RY; j++) {
  468.             dy(i, j) = param1*(float)i/30;
  469.         }
  470.         break;
  471.     case 8:
  472.         for (i = 0; i < RX; i++)
  473.         for (j = 0; j < RY; j++) {
  474.             dy(i, j) = param1*5*sin((i*PI*14)/(RX-1))*cos((j*PI*2*param2)/(RY-1));
  475.         }
  476.         break;
  477.     case 9:
  478.         for (i = 0; i < RX; i++)
  479.         for (j = 0; j < RY; j++) {
  480.             dy(i, j) = (((rand())>>5)&0x1f) - 16;
  481.         }
  482.         for (k = 0; k < 4; k++)
  483.         for (i = 0; i < RX; i++)
  484.             for (j = 0; j < RY; j++) {
  485.             i1 = i+1; j1 = j+1;
  486.             i_1 = i-1; j_1 = j-1;
  487.             if (i1 == RX) i1 = 0;
  488.             if (j1 == RY) j1 = 0;
  489.             if (i_1 == -1) i1 = RX-1;
  490.             if (j_1 == -1) j1 = RY-1;
  491.             dy(i, j) = (4*dy(i, j) + dy(i1, j1) + dy(i_1, j1) +
  492.                     dy(i_1, j_1) + dy(i1, j_1) + 2*(dy(i, j1) +
  493.                     dy(i, j_1) + dy(i1, j) + dy(i_1, j)))/16.0;
  494.             }
  495.         break;
  496.     case 10:
  497.         for (i = 0; i < RX; i++)
  498.         for (j = 0; j < RY; j++) {
  499.             dy(i, j) = param1*8*cos((i*PI*10*param2)/(RX-1));
  500.         }
  501.         break;
  502.     case 11:
  503.         for (i = 0; i < RX; i++)
  504.         for (j = 0; j < RY; j++) {
  505.             x1 = -1.0 + 2.0*i/(RX-1);
  506.             y1 = -1.0 + 2.0*j/(RY-1);
  507.             dy(i, j) = 12.0*x1*y1 + param2;
  508.         }
  509.         break;
  510.     case 12:
  511.         for (i = 0; i < RX; i++)
  512.         for (j = 0; j < RY; j++) {
  513.             x1 = -1.0 + 2.0*i/(RX-1);
  514.             y1 = -1.0 + 2.0*j/(RY-1);
  515.             r = x1*x1+y1*y1;
  516.             dy(i, j) = param1*8*x1/(1.0+r*r);
  517.         }
  518.         break;
  519.     case 13:
  520.         for (i = 0; i < RX; i++)
  521.         for (j = 0; j < RY; j++) {
  522.             x1 = -1.0 + 2.0*i/(RX-1);
  523.             y1 = -1.0 + 2.0*j/(RY-1);
  524.             r = x1*x1+y1*y1;
  525.             dy(i, j) = -param1*8.0*y1/(1.0+r*r);
  526.         }
  527.         break;
  528.     case 14:
  529.         for (i = 0; i < RX; i++)
  530.         for (j = 0; j < RY; j++) {
  531.             x1 = -1.0 + 2.0*i/(RX-1);
  532.             y1 = -1.0 + 2.0*j/(RY-1);
  533.             r = x1*x1+y1*y1;
  534.             dy(i, j) = param1*8.0*y1/(1.0+r*r);
  535.         }
  536.         break;
  537.     case 15:
  538.         for (i = 0; i < RX; i++)
  539.         for (j = 0; j < RY; j++) {
  540.             x1 = -1.0 + 2.0*i/(RX-1)-0.5;
  541.             y1 = -1.0 + 2.0*j/(RY-1);
  542.             r = x1*x1+y1*y1;
  543.             dy(i, j) = param1*7.0*y1/(1.0+r*r);
  544.             x1 = -1.0 + 2.0*i/(RX-1)+0.5;
  545.             y1 = -1.0 + 2.0*j/(RY-1);
  546.             r = x1*x1+y1*y1;
  547.             dy(i, j) -= param1*7.0*(y1)/(1.0+r*r);
  548.         }
  549.         break;
  550.     case 16:
  551.         for (i = 0; i < RX; i++)
  552.         for (j = 0; j < RY; j++) {
  553.             x1 = -1.0 + 2.0*i/(RX-1);
  554.             y1 = -1.0 + 2.0*j/(RY-1);
  555.             r = x1*x1+y1*y1;
  556.             dy(i, j) = param1*8*x1/(0.5+r) +y1*3;
  557.         }
  558.         break;
  559.     case 17:
  560.         for (i = 0; i < RX; i++)
  561.         for (j = 0; j < RY; j++) {
  562.             dy(i, j) = param1*5*sin((i*PI*14)/(RX-1))+cos((j*PI*2*param2)/(RY-1));
  563.         }
  564.         break;
  565.     case 18:
  566.         for (i = 0; i < RX; i++)
  567.         for (j = 0; j < RY; j++) {
  568.             x1 = -1.0 + 2.0*i/(RX-1);
  569.             y1 = -1.0 + 2.0*j/(RY-1);
  570.             r = x1*x1+y1*y1;
  571.             dy(i, j) = param1*8.0*y1/(1.0+r)*cos(20*r);
  572.         }
  573.         break;
  574.     case 19:
  575.         for (i = 0; i < RX; i++)
  576.         for (j = 0; j < RY; j++) {
  577.             x1 = -1.0 + 2.0*i/(RX-1);
  578.             y1 = -1.0 + 2.0*j/(RY-1);
  579.             dy(i, j) = param1*8.0*x1*y1;
  580.         }
  581.         break;
  582.     case 20:
  583.         for (i = 0; i < RX; i++)
  584.         for (j = 0; j < RY; j++) {
  585.             x1 = -1.0 + 2.0*i/(RX-1);
  586.             y1 = -1.0 + 2.0*j/(RY-1);
  587.             x1 *= param2; y1 *= param2;
  588.             dy(i, j) = param1*8.0*exp(x1)*sin(5*y1);
  589.         }
  590.         break;
  591.     case 21:
  592.         for (i = 0; i < RX; i++)
  593.         for (j = 0; j < RY; j++) {
  594.             x1 = -1.0 + 2.0*i/(RX-1);
  595.             y1 = -1.0 + 2.0*j/(RY-1);
  596.             dy(i, j) = -param2*8.0*(cos(4*PI*(x1+y1)));
  597.         }
  598.         break;
  599.     case 22:
  600.         for (i = 0; i < RX; i++)
  601.         for (j = 0; j < RY; j++) {
  602.             x1 = -1.0 + 2.0*i/(RX-1);
  603.             y1 = -1.0 + 2.0*j/(RY-1);
  604.             dy(i, j) = -param2*8.0/(1.3+cos(4*PI*(x1+y1)));
  605.         }
  606.         break;
  607.     case 23:
  608.         for (i = 0; i < RX; i++)
  609.         for (j = 0; j < RY; j++) {
  610.             x1 = -1.0 + 2.0*i/(RX-1);
  611.             y1 = -1.0 + 2.0*j/(RY-1);
  612.             dy(i, j) = -param1*8.0*(cos(param2*4*PI*(x1*x1)));
  613.         }
  614.         break;
  615.     case 24:
  616.         for (i = 0; i < RX; i++)
  617.         for (j = 0; j < RY; j++) {
  618.             x1 = -1.0 + 2.0*i/(RX-1);
  619.             y1 = -1.0 + 2.0*j/(RY-1);
  620.             dy(i, j) = -param1*8.0*(cos(param2*4*PI*(x1*x1*x1)));
  621.         }
  622.         break;
  623.     case 25:
  624.         for (i = 0; i < RX; i++)
  625.         for (j = 0; j < RY; j++) {
  626.             x1 = -1.0 + 2.0*i/(RX-1);
  627.             y1 = -1.0 + 2.0*j/(RY-1);
  628.             dy(i, j) = -param1*12.0*y1*(cos(param2*4*PI*(x1)));
  629.         }
  630.         break;
  631.     case 26:
  632.         for (i = 0; i < RX; i++)
  633.         for (j = 0; j < RY; j++) {
  634.             x1 = -1.0 + 2.0*i/(RX-1);
  635.             y1 = -1.0 + 2.0*j/(RY-1);
  636.             dy(i, j) = -param1*15.0*y1*y1*(cos(param2*4*PI*(x1)));
  637.         }
  638.         break;
  639.     }
  640. }
  641.  
  642. void iterate(unsigned char *R, unsigned char *R1)
  643. {
  644.     long i, j, k;
  645.     float i1, j1;
  646.     long ifl, jfl, ifl1, jfl1, ifl2, jfl2;
  647.     float ifr, jfr;
  648.     
  649.     generation++;
  650.     for (i = 0; i < RX; i++)
  651.     for (j = 0; j < RY; j++) {
  652.         i1 = dx(i, j); j1 = dy(i, j);
  653.         ifl = floor(i1); jfl = floor(j1);
  654.         ifr = i1 - ifl; jfr = j1 - jfl;
  655.         ifl1 = ifl+i; jfl1 = jfl+j;
  656.         ifl2 = ifl1+1; jfl2 = jfl1+1;
  657.         while (ifl1 >= RX) ifl1 -= RX;
  658.         while (jfl1 >= RY) jfl1 -= RY;
  659.         while (ifl2 >= RX) ifl2 -= RX;
  660.         while (jfl2 >= RY) jfl2 -= RY;
  661.         while (ifl1 < 0) ifl1 += RX;
  662.         while (jfl1 < 0) jfl1 += RY;
  663.         while (ifl2 < 0) ifl2 += RX;
  664.         while (jfl2 < 0) jfl2 += RY;
  665.         for (k = 0; k < 3; k++)
  666.             raster1(i, j, k) = raster(ifl1, jfl1, k)*(1.0-ifr)*(1.0-jfr) +
  667.                 raster(ifl2, jfl1, k)*(ifr)*(1.0-jfr) +
  668.                 raster(ifl1, jfl2, k)*(1.0-ifr)*(jfr) +
  669.                 raster(ifl2, jfl2, k)*(ifr)*(jfr);
  670.     }
  671.     if (ipattern == 0)
  672.     for (i = RX/2-5; i < RX/2+5; i++)
  673.         for (j = RY/2-5; j < RY/2+5; j++)
  674.         raster1(i, j, 0) = raster1(i, j, 1) = raster1(i, j, 2) = 255;
  675. }
  676.  
  677. void printdata()
  678. {
  679.     long i, j;
  680.     
  681.     printf("unsigned char reddata[%d][%d] = {\n", RX, RY);
  682.     for (j = 0; j < RY; j++) {
  683.         printf("{");
  684.     for (i = 0; i < RX; i++) {
  685.         printf("0x%2.2x,", raster(i, j, 0));
  686.     }
  687.     printf("},\n");
  688.     }
  689.     printf("};\n");
  690.     printf("unsigned char greendata[%d][%d] = {\n", RX, RY);
  691.     for (j = 0; j < RY; j++) {
  692.         printf("{");
  693.     for (i = 0; i < RX; i++) {
  694.         printf("0x%2.2x,", raster(i, j, 1));
  695.     }
  696.     printf("},\n");
  697.     }
  698.     printf("};\n");
  699.     printf("unsigned char bluedata[%d][%d] = {\n", RX, RY);
  700.     for (j = 0; j < RY; j++) {
  701.         printf("{");
  702.     for (i = 0; i < RX; i++) {
  703.         printf("0x%2.2x,", raster(i, j, 2));
  704.     }
  705.     printf("},\n");
  706.     }
  707.     printf("};\n");
  708. }
  709.  
  710. main(int argc, char **argv)
  711. {
  712.     short val, i, j;
  713.  
  714.     if ((argc != 4) && (argc != 5) && (argc != 6)) {
  715.     printf("usage: %s init dx dy [param1] [param2]\n", argv[0]);
  716.     printf("-1 <= init <= %d\n", ipatternmax);
  717.     printf("0 <=  dx  <= %d\n", dmax);
  718.     printf("0 <=  dy  <= %d\n", dmax);
  719.     exit(0);
  720.     }
  721.     ipattern = atoi(argv[1]);
  722.     idx = atoi(argv[2]);
  723.     idy = atoi(argv[3]);
  724.     if (argc >= 5)
  725.     param1 = atof(argv[4]);
  726.     if (argc == 6)
  727.     param2 = atof(argv[5]);
  728.     if (ipattern > ipatternmax || ipattern < -1) ipattern = 1;
  729.     if (idx > dmax || idx < 0) idx = 1;
  730.     if (idy > dmax || idy < 0) idy = 1;
  731.     initraster();
  732.     prefsize(RX, RY);
  733.     winopen("swirl");
  734.     qdevice(ESCKEY);
  735.     qdevice(QKEY); qdevice(SKEY);
  736.     qdevice(IKEY); qdevice(PKEY);
  737.     RGBmode();
  738.     doublebuffer();
  739.     gconfig();
  740.     displayraster();
  741.     while (1) {
  742.     while (qtest()) switch(qread(&val)) {
  743.         case SKEY:
  744.             if (val == 0) break;
  745.         stopped = 1-stopped;
  746.         displayraster();
  747.         break;
  748.         case IKEY:
  749.         if (val == 0) break;
  750.         printf("saving image . . .\n");
  751.         savewindow("out.rgb");
  752.         printf("saved image as 'out.rgb'\n");
  753.         break;
  754.         case ESCKEY:
  755.         case QKEY:
  756.         exit(0);
  757.         case PKEY:
  758.             if (val == 0) break;
  759.         printdata();
  760.         break;
  761.         case REDRAW:
  762.         displayraster();
  763.         break;
  764.         default:
  765.         break;
  766.     }
  767.     if (stopped == 0) {
  768.         if (dflag == 0)
  769.         iterate(R, R1);
  770.         else
  771.         iterate(R1, R);
  772.         dflag = 1 - dflag;
  773.         displayraster();
  774.     } else sginap(5);
  775.     }
  776. }
  777.